﻿using BLevy.Entidad;
using BLevy.Negocio;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Printing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace BLevy.UI.Utils
{
    public class ImpresionCupones
    {
        //declaro el printdocument
        private PrintDocument _impresion = new PrintDocument();

        //declaro el printdialog
        private PrintDialog _dialog = new PrintDialog();
        
        //declaro los contadores
        private int totalcupones = 0;
        private int cuponporpagina = 0;

        //PaperSize paperSize = new PaperSize("A4", 827, 1169);
        //declaro las fuentes
        Font fuente = new Font("Arial", 8, FontStyle.Regular);
        Font fuente_cdb = new Font("Code 39-hoch-Logitogo", 23, FontStyle.Regular);
        
        //declaro el lapiz
        Pen lapiz = new Pen(Color.Black);

        //declaro la lista de cupones
        private IList<Cupon> cuponesL;


        //constructor
        public ImpresionCupones(IList<Cupon> cupones)
        {
            cuponesL = cupones;
        }

        public void Imprimir()
        {
            cuponporpagina = totalcupones = 0;

            _dialog.Document = _impresion;
            _dialog.UseEXDialog = true;

            _impresion.PrintPage += new PrintPageEventHandler
                   (this._impresion_ImprimirCupon);

            if (_dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                _impresion.Print();
            }
        }

        private void _impresion_ImprimirCupon(object sender, PrintPageEventArgs e)
        {

            try
            {

                Socio socio = null;

                int arribaY = 20;
                
                //dibujo las leyendas del cupon
                //e.Graphics.DrawString("Gestora", new Font("Arial", 10, FontStyle.Bold), Brushes.Black, 15, 45);
                //e.Graphics.DrawString("Gestora", new Font("Arial", 10, FontStyle.Bold), Brushes.Black, 570, 45);

                //e.Graphics.DrawString("Caá Guazú 805 - Tel. 425855 - C. Cuatia (Ctes.)", fuente, Brushes.Black, 15, 85);
                //e.Graphics.DrawString("Caá Guazú 805 - Tel. 425855 - C. Cuatia (Ctes.)", fuente, Brushes.Black, 570, 85);          

                //e.Graphics.DrawString("MUTUAL APOYO SOLIDARIO", new Font("Arial", 10, FontStyle.Bold), Brushes.Black, 320, 10);
                //e.Graphics.DrawString("DE SERVICIOS FUNEBRES", new Font("Arial", 10, FontStyle.Bold), Brushes.Black, 327, 25);
                //e.Graphics.DrawString("MAT. INAM S.F 898 - CUIT 33-61113257-9 - DNRP 61112357", new Font("Arial", 7, FontStyle.Regular), Brushes.Black, 280, 37);
                //e.Graphics.DrawString("ING. BRUTOS NO CONTRIBUYENTE - IVA NO RESPONSABLE", new Font("Arial", 7, FontStyle.Regular), Brushes.Black, 270, 47);

                //e.Graphics.DrawString("PERÍODO", fuente, Brushes.Black, 15, 305);
                //e.Graphics.DrawString("PERÍODO", fuente, Brushes.Black, 570, 305);

                //e.Graphics.DrawString("1° VENCIMIENTO", fuente, Brushes.Black, 115, 305);
                //e.Graphics.DrawString("1° VENCIMIENTO", fuente, Brushes.Black, 670, 305);

                //e.Graphics.DrawString("2° VENCIMIENTO", fuente, Brushes.Black, 115, 365);
                //e.Graphics.DrawString("2° VENCIMIENTO", fuente, Brushes.Black, 670, 365);            

                //e.Graphics.DrawString("ADHERENTES", fuente, Brushes.Black, 280, 65);

                //recorro los cupones
                while (totalcupones < cuponesL.Count)
                {
                    //obtengo el socio correspondiente al cupon
                    socio = Negocio.Socios.FindById(cuponesL[totalcupones].socio_id);
                    socio.localidad = Localidades.FindById(socio.localidad_id);
                    socio.zona = Negocio.Zonas.FindById(socio.zona_id);
                    socio.adherentes = Adherentes.FindByIdSocio(socio.id);
                    socio.plan = Planes.FindById(socio.plan_id);
                    //obtengo los periodos
                    IList<Periodo> periodosL = Periodos.GetPeriodosByIdCupon(cuponesL[totalcupones].id);
                    periodosL.OrderByDescending(x => x.fecha_generacion);
                    //obtengo los datos del cupon
                    cuponesL[totalcupones].detalles = Cupones.FindAllDetallesByIdCupon(cuponesL[totalcupones].id);

                    if (cuponporpagina == 0) //imprimo arriba
                    {
                        e.Graphics.DrawString("           " + cuponesL[totalcupones].numero, fuente, Brushes.Black, 15, arribaY);
                        e.Graphics.DrawString("           " + cuponesL[totalcupones].numero, fuente, Brushes.Black, 570, arribaY);

                        arribaY += 70;
                        //izquierda
                        e.Graphics.DrawString("          " + socio.numero_certificado.ToString(), fuente, Brushes.Black, 15, arribaY + 20);
                        e.Graphics.DrawString("          " + socio.apellido, fuente, Brushes.Black, 15, arribaY + 40);
                        e.Graphics.DrawString("      " + socio.zona.zona, fuente, Brushes.Black, 185, arribaY + 40);
                        e.Graphics.DrawString("         " + socio.nombres, fuente, Brushes.Black, 15, arribaY + 60);
                        Rectangle rectIzq = new Rectangle(85, arribaY + 80, 150, fuente.Height * 2);
                        e.Graphics.DrawRectangle(Pens.White, rectIzq);
                        e.Graphics.DrawString("          ", fuente, Brushes.Black, 15, arribaY + 80);
                        e.Graphics.DrawString(socio.direccion, fuente, Brushes.Black, rectIzq);
                        e.Graphics.DrawString("          " + socio.localidad.localidad, fuente, Brushes.Black, 15, arribaY + 120);

                        //derecha
                        e.Graphics.DrawString("          " + socio.numero_certificado.ToString(), fuente, Brushes.Black, 570, arribaY + 20);
                        e.Graphics.DrawString("          " + socio.apellido, fuente, Brushes.Black, 570, arribaY + 40);
                        e.Graphics.DrawString("      " + socio.zona.zona, fuente, Brushes.Black, 740, arribaY + 40);
                        e.Graphics.DrawString("         " + socio.nombres, fuente, Brushes.Black, 570, arribaY + 60);
                        Rectangle rectDer = new Rectangle(640, arribaY + 80, 150, fuente.Height * 2);
                        e.Graphics.DrawRectangle(Pens.White, rectDer);
                        e.Graphics.DrawString("           ", fuente, Brushes.Black, 570, arribaY + 80);
                        e.Graphics.DrawString(socio.direccion, fuente, Brushes.Black, rectDer);
                        e.Graphics.DrawString("           " + socio.localidad.localidad, fuente, Brushes.Black, 570, arribaY + 120);

                        arribaY = 100;


                        //si no tiene cobertura dibujo un asterisco
                        string vigencia = string.Empty;
                        TimeSpan span = new TimeSpan();
                        foreach (Adherente adherente in socio.adherentes)
                        {
                            span = DateTime.Now.Date - adherente.fecha_nacimiento;
                            int edad_adherente = (int)Math.Truncate(span.TotalDays / 365.25);

                            if (DateTime.Now < adherente.vigencia)
                                vigencia = " * ";
                            else
                                vigencia = String.Empty;

                            e.Graphics.DrawString(vigencia, fuente, Brushes.Black, 280, arribaY);
                            e.Graphics.DrawString(adherente.apellido + ", " + adherente.nombres, fuente, Brushes.Black, 290, arribaY);
                            e.Graphics.DrawString(edad_adherente.ToString(), fuente, Brushes.Black, 530, arribaY);

                            arribaY += 20;
                        }

                        arribaY = 330;

                        //obtengo los periodos correspondientes al cupon
                        string mensaje_periodo = string.Empty;

                        foreach (Periodo periodo in periodosL)
                        {
                            int mes = periodo.periodo.Month;
                            int ano = periodo.periodo.Year;
                            string _periodo = String.Format("{0:00}", mes) + "/" + ano.ToString();

                            e.Graphics.DrawString(_periodo, fuente, Brushes.Black, 15, arribaY);
                            e.Graphics.DrawString(_periodo, fuente, Brushes.Black, 570, arribaY);
                            arribaY += 20;

                            mensaje_periodo += Periodos.FindMensajeMasivoPeriodo(periodo.id) + " - ";
                        }

                        arribaY = 320;

                        //izquierda
                        e.Graphics.DrawString(periodosL[0].vencimiento_1.ToShortDateString(), fuente, Brushes.Black, 150, arribaY);
                        e.Graphics.DrawString("$ " + cuponesL[totalcupones].total.ToString(), fuente, Brushes.Black, 150, arribaY + 20);
                        //derecha
                        e.Graphics.DrawString(periodosL[0].vencimiento_1.ToShortDateString(), fuente, Brushes.Black, 680, arribaY);
                        e.Graphics.DrawString("$ " + cuponesL[totalcupones].total.ToString(), fuente, Brushes.Black, 680, arribaY + 20);

                        arribaY += 60;

                        //izquierda
                        e.Graphics.DrawString(periodosL[0].vencimiento_2.ToShortDateString(), fuente, Brushes.Black, 150, arribaY);
                        if (socio.plan.recargo == 0)
                        {
                            e.Graphics.DrawString("$ " + (cuponesL[totalcupones].total).ToString(), fuente, Brushes.Black, 150, arribaY + 20);
                        }
                        else
                        {
                            e.Graphics.DrawString("$ " + (cuponesL[totalcupones].total + Convert.ToDouble(periodosL[0].recargo)).ToString(), fuente, Brushes.Black, 150, arribaY + 20);
                        }

                        //derecha
                        e.Graphics.DrawString(periodosL[0].vencimiento_2.ToShortDateString(), fuente, Brushes.Black, 680, arribaY);
                        if (socio.plan.recargo == 0)
                        {
                            e.Graphics.DrawString("$ " + (cuponesL[totalcupones].total).ToString(), fuente, Brushes.Black, 680, arribaY + 20);
                        }
                        else
                        {
                            e.Graphics.DrawString("$ " + (cuponesL[totalcupones].total + Convert.ToDouble(periodosL[0].recargo)).ToString(), fuente, Brushes.Black, 680, arribaY + 20);
                        }

                        arribaY += 120;

                        e.Graphics.DrawString("*" + cuponesL[totalcupones].numero + "*", fuente_cdb, Brushes.Black, 20, arribaY - 20);

                        e.Graphics.DrawString("         " + socio.observaciones, fuente, Brushes.Black, 290, 430);

                        //mensanje masivo periodos
                        e.Graphics.DrawString(mensaje_periodo, fuente, Brushes.Black, 290, 500);

                        arribaY += 20;
                    }
                    else // imprimo abajo
                    {

                    }


                    totalcupones += 1;
                    if (totalcupones < cuponesL.Count)
                    {
                        cuponporpagina = 0;
                        e.HasMorePages = true;
                        return;
                    }
                    else
                    {
                        cuponporpagina += 1;
                        e.HasMorePages = false;
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
 



    }
}
